package com.zmn.plat.persistence.interfaces.channel;

import com.zmn.plat.model.entity.category.ServCategAndCategTwoQuery;
import com.zmn.plat.model.entity.channel.ChannelServiceAreaCategory;
import com.zmn.plat.model.vo.channel.ChannelServiceAreaProductCategoryVo;
import com.zmn.plat.model.vo.channel.category.ChannelCategoryUnionVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 渠道区域服务分类
 *
 * @author xiangjunming
 * @since 2019 /08/19 12:15:26
 */
public interface ChannelServiceAreaCategoryDAO {

    /**
     * 根据ID查询
     *
     * @param id the id
     * @return the channel new service area category
     */
    ChannelServiceAreaCategory findByKey(Integer id);

    /**
     * 根据服务区域ID查询
     *
     * @param serviceAreaId the service area id
     * @param showType      产品分类 1后台 2前台
     * @return the list
     */
    List<ChannelServiceAreaCategory> listByServiceAreaId(@Param("serviceAreaId") Integer serviceAreaId, @Param("showType") Integer showType);

    /**
     * 根据渠道ID，分类标识查询服务区域ID
     *
     * @param channelId
     * @param showType  产品分类 1后台 2前台
     * @return
     */
    List<Integer> listServiceAreaIdByChannelIdAndShowType(@Param("channelId") Integer channelId, @Param("showType") Integer showType);

    /**
     * 根据渠道ID，分类标识，服务分类ID，二级分类ID查询
     *
     * @param channelId
     * @param showType
     * @param servCategIds
     * @param categIds
     * @return
     */
    List<ChannelServiceAreaCategory> listByChannelIdAndShowTypeAndServCategIdsAndCategIds(@Param("channelId") Integer channelId, @Param("showType") Integer showType, @Param("servCategIds") List<Integer> servCategIds, @Param("categIds") List<Integer> categIds);

    /**
     * 根据渠道ID，城市id，产品类型查询分类信息
     *
     * @param channelId
     * @param showType  产品分类 1后台 2前台
     * @param channelId
     * @param cityId
     * @return
     */
    List<ChannelServiceAreaProductCategoryVo> listByChannelIdAndCityIdAndShowType(@Param("channelId") Integer channelId, @Param("cityId") Integer cityId, @Param("showType") Integer showType);

    /**
     * 根据渠道ID和城市ID和服务分类ID集合查询渠道开通品类
     * @param channelId        渠道ID
     * @param cityId           城市ID
     * @param servCategIdList  服务分类ID集合
     * @return
     */
    List<ChannelCategoryUnionVo> listByChannelIdAndCityIdAndServCategIdList(Integer channelId, Integer cityId, List<Integer> servCategIdList);

    /**
     * 根据渠道ID，城市id，查询渠道开通的服务分类ID和后台二级产品分类ID集合
     *
     * @param channelId 渠道ID
     * @param cityId    城市ID
     * @return
     */
    List<ServCategAndCategTwoQuery> listServCategAndCategTwoQueryByChannelIdAndCityId(@Param("channelId") Integer channelId, @Param("cityId") Integer cityId);

    /**
     * 根据渠道ID，城市id，查询渠道开通的服务分类ID和前台二级产品分类ID集合
     *
     * @param channelId 渠道ID
     * @param cityId    城市ID
     * @return
     */
    List<ServCategAndCategTwoQuery> listServCategAndShowCategTwoQueryByChannelIdAndCityId(@Param("channelId") Integer channelId, @Param("cityId") Integer cityId);

    /**
     * 根据渠道ID，城市ID，前后台标识查询分类配置数量
     *
     * @param channelId
     * @param cityId
     * @param showType
     * @return
     */
    int count(@Param("channelId") Integer channelId, @Param("cityId") Integer cityId, @Param("showType") Integer showType);

    /**
     * 根据ID修改
     *
     * @param record the record
     * @return the int
     */
    int updateByKey(ChannelServiceAreaCategory record);

    /**
     * 新增
     *
     * @param record the record
     * @return the int
     */
    int insert(ChannelServiceAreaCategory record);

    /**
     * 批量新增
     *
     * @param list the list
     * @return the int
     */
    int insertBatch(List<ChannelServiceAreaCategory> list);

    /**
     * 根据ID删除
     *
     * @param id the id
     * @return the int
     */
    int deleteByKey(Integer id);

    /**
     * 根据ID集合删除
     *
     * @param ids the id
     * @return the int
     */
    int deleteByKeys(@Param("ids") List<Integer> ids);

    /**
     * 根据服务区域ID删除
     *
     * @param serviceAreaId 服务区域ID
     * @param showType      产品分类 1后台 2前台
     * @return the int
     */
    int deleteByServiceAreaId(@Param("serviceAreaId") Integer serviceAreaId, @Param("showType") Integer showType);

    /**
     * 根据服务区域ID和服务分类ID删除
     *
     * @param serviceAreaId 服务区域ID
     * @param showType      产品分类 1后台 2前台
     * @return the int
     */
    int deleteByServiceAreaIdAndServCategId(@Param("serviceAreaId") Integer serviceAreaId, @Param("servCategId") Integer servCategId, @Param("showType") Integer showType);

    /**
     * 根据服务区域IDS和服务分类ID删除
     *
     * @param serviceAreaIds 服务区域IDS
     * @param servCategId    服务分类ID
     * @param showType       前后台类型：1后台 2前台
     * @return
     */
    int deleteByServiceAreaIdsAndServCategId(@Param("serviceAreaIds") List<Integer> serviceAreaIds, @Param("servCategId") Integer servCategId, @Param("showType") Integer showType);

    /**
     * 根据服务区域ID批量删除
     *
     * @param serviceAreaIds 服务区域ID
     * @param showType       产品分类 1后台 2前台
     * @return the int
     */
    int deleteByServiceAreaIds(@Param("serviceAreaIds") List<Integer> serviceAreaIds, @Param("showType") Integer showType);

    /**
     * 描述: 根据渠道id删除
     *
     * @param channelId 渠道id
     * @return java.lang.Integer
     * @author guoqiao
     * @since 2021/6/9 14:27
     */
    Integer deleteByChannelId(Integer channelId);

    /**
     * 描述: 从旧渠道复制到新渠道
     *
     * @param originalChannelId 原渠道ID
     * @param targetChannelId 新渠道ID
     * @param operator 操作者
     * @return java.lang.Boolean
     * @author guoqiao
     * @since 2021/6/8 13:49
     */
    void copy(Integer originalChannelId, int targetChannelId, String operator);
}